变种水仙花(Lily Number的判断)

变种水仙花(Lily Number的判断)

题目:变种水仙花数-Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number.
例如:

1
2
3
4
例如:
655 =6*55+65*5
1461=1*461+14*61+146*1

求出5位数中的所有 Lily Number.

这个题目的关键在于如何将一个数拆分成如上所示的样子,这让我们很容易想到取模和除法的运算。首先我们用一个for循环将我们所要判断的数组涵盖进去,接着我们创建一个函数func,用来计算一个数的拆分后的乘积和。在该函数中我们创建两个变量asum,其中a用作取模和除数运算中的除数,sum用来存放拆分之后的和。接着我们利用while循环来实现一个数的拆分后的成绩和,我们让x/a>0作为循环的条件,因为一个数拆分最多拆成最高位和后面几位的情况(不可能拆成0和它本身,这样不符合条件),循环中我们进行*(x % a) (x / a)的操作即是拆分后的乘积(a为拆分一个数的断点,如a=10的话就是将一个数从十位拆成左边和右边)。将它的值存放在sum中,然后让a自乘10来进行下一位的拆分,将其值也自加在sum中,最后返回将sum作为返回值。最后在主函数的for循环*中用if判断语句,判断i的值与函数的返回值比较如果相等则该数是Lily Number.

#include<stdio.h>
int func(int x)
{
	int a = 10;
	int sum = 0;
	while (x/a > 0)
	{
		sum+= (x % a) * (x / a);
		a *=10;
	}
	return sum;
}
int main()
{
	for (int i = 10000; i < 100000; i++)
	{
		if (i == func(i))
		{
			printf("%d  ", i);
		}
	}
	return 0;
}